﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections.ObjectModel;
using Entidades.Seguridad;
using Entidades.Sistema;

namespace Vista.Sistema
{
    public partial class FormRegistrarOrden : Form
    {
        string Op;
        BindingSource bsPedidos;
        List<Entidades.Sistema.Pedido> colPedidos;
        private Entidades.Sistema.OrdenProduccion oOrdenProduccion;
        private Entidades.Sistema.Producto oProd;
        private Entidades.Seguridad.Usuario _Usuario;
        private int TotalaProducit;
        private Entidades.Sistema.Producto oProducto;

        public FormRegistrarOrden(string tipoOper,Entidades.Seguridad.Usuario oUsuario)
        {
            InitializeComponent();
            this.CenterToScreen();
            _Usuario = new Usuario();
            _Usuario = oUsuario;
            oProducto = new Entidades.Sistema.Producto();
            oOrdenProduccion = new Entidades.Sistema.OrdenProduccion();
            Op = tipoOper;
        }

        public FormRegistrarOrden(string tipoOper,Entidades.Seguridad.Usuario oUsuario, Entidades.Sistema.OrdenProduccion oOrden)
        {
            InitializeComponent();
            this.CenterToScreen();
            _Usuario = new Usuario();
            _Usuario = oUsuario;
            oProducto = new Entidades.Sistema.Producto();
            oOrdenProduccion = new OrdenProduccion();
            oOrdenProduccion = oOrden;
            Op = tipoOper;
        }

        private void FormRegistrarOrden_Load(object sender, EventArgs e)
        {
            if (Op == "Alta")
            {
                cargaComboProductos();
                this.Text = "Alta Orden Produccion";
            }
            else
            {
                this.Text = "Modificacion Orden Produccio";
                oProducto.cod_producto = oOrdenProduccion.producto.cod_producto;
                oProducto.nombre = oOrdenProduccion.producto.nombre;

                //Ver posibilidad de cargar el cambo de otra forma
                BindingList<Entidades.Sistema.Producto> bslProductos = new BindingList<Entidades.Sistema.Producto>();
                bslProductos.Add(oProducto);
                cmbProductos.DataSource = bslProductos;
                this.cmbProductos.DisplayMember = "nombre";
                dateFechaInicio.Value = oOrdenProduccion.fecha_inicio;
                dateFechaEstimada.Value = oOrdenProduccion.fecha_fin;
                cmbProductos.Enabled = false;
                btnCalcTotal.Text = "Recalcular Total";
                labelCantidad.Text = oOrdenProduccion.cap_utilizada.ToString();
            }
        }
        
        private void cargaComboProductos()
        {
            //Cargamos el campo de Productos
            BindingList<Entidades.Sistema.Producto> bslProductos = new BindingList<Entidades.Sistema.Producto>();
            ReadOnlyCollection<Entidades.Sistema.Producto> colProductos;

            colProductos = Controladora.Sistema.CUGestionarordendeproduccion.ObtenerInstancia().ConsultarProductos();

            oProd = new Entidades.Sistema.Producto();

            oProd.cod_producto = 0;
            oProd.nombre = "Seleccione Producto";
            bslProductos.Add(oProd);

            foreach (Entidades.Sistema.Producto oProducto in colProductos)
            {
                bslProductos.Add(oProducto);
            }

            cmbProductos.DataSource = bslProductos;
            this.cmbProductos.DisplayMember = "nombre";
        }

        private void btnguardar_Click(object sender, EventArgs e)
        {
            if (validardatos())
            { 

                //Obtengo el producto seleccionado y se lo asigno a la orden.
                oProducto = (Entidades.Sistema.Producto)cmbProductos.SelectedItem;
                oOrdenProduccion.producto = oProducto;
                //Cargo el estado de la orden como creada.
                oOrdenProduccion.stateOrden.EstadoCreada(oOrdenProduccion);
                //oOrdenProduccion.cap_total = oOrdenProduccion.producto;
                //El valor de la capicidad total a producir debo obtenerlo del producto.
                oOrdenProduccion.cap_total = 100;
            
                //La capidad utilizada se obtiene de lo ingresado en el text box
                oOrdenProduccion.cap_utilizada = Convert.ToInt32(txtCantAProducir.Text);

                oOrdenProduccion.cap_disponible = oOrdenProduccion.cap_total - oOrdenProduccion.cap_utilizada;
                //Cargo las fechas de la orden.
                oOrdenProduccion.fecha_inicio = dateFechaInicio.Value;
                oOrdenProduccion.fecha_fin = dateFechaEstimada.Value;
                oOrdenProduccion.fecha_orden = DateTime.Now;
                //Se cargan los datos para la auditoria.
                oOrdenProduccion.auditoria.USUARIO.IdUsuario = _Usuario.IdUsuario;
                oOrdenProduccion.auditoria.FechaModificacion = DateTime.Now;

                if (Op == "Alta")
                {
                    oOrdenProduccion.auditoria.TipoOperacion = AuditoriaTipoOperacion.Alta;
                    int res = Controladora.Sistema.CUGestionarordendeproduccion.ObtenerInstancia().RegistrarOrden(oOrdenProduccion);

                    string mensaje = string.Format("Se genero la orden de produccion de forma correcta - Nro. === '{0}' ===", res);
                    MessageBox.Show(mensaje, "", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    this.Close();
                }
                else
                {
                    oOrdenProduccion.auditoria.TipoOperacion = AuditoriaTipoOperacion.Modificacion;
                    bool res = Controladora.Sistema.CUGestionarordendeproduccion.ObtenerInstancia().ModificarOrdenProduccion(oOrdenProduccion);

                    string mensaje = string.Format("Se Modifico la orden de produccion de forma correcta - Nro. === '{0}' ===", oOrdenProduccion.cod_orden);
                    MessageBox.Show(mensaje, "", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    this.Close();
                }
            }
        }

        private void btncancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private bool validardatos()
        {
            if (this.txtCantAProducir.Text.Trim() == "")
            {
                MessageBox.Show("Debe ingresar la cantidad a producir");
                txtCantAProducir.Focus();
                return false;
            }
            else if (this.txtdescrip.Text.Trim() == "")
            {
                MessageBox.Show("Debe ingresar una descripcion para la orden de produccion");
                txtdescrip.Focus();
                return false;
            }
            return true;
        }

        //Evento que controla que solo se ingrese valores númericos en txtCantAProducir 
        private void txtCantAProducir_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }


        //Funciones que se puede eliminar
        #region
        // Estas funciones quedaron obsoletas

        private void btnCalcTotal_Click(object sender, EventArgs e)
        {
            oProducto = (Entidades.Sistema.Producto)cmbProductos.SelectedItem;

            colPedidos = Controladora.Sistema.CUGestionarordendeproduccion.ObtenerInstancia().ConsultarPedidosPorProducto(oProducto);
            

            if (btnCalcTotal.Text == "Recalcular Total")
            {
                oOrdenProduccion.cap_utilizada = 0;
            }

            //Creo una consulta para poder Mostrar las cantidades de cada pedido
            foreach (Pedido ped in colPedidos)
            {
                calculaTotol(ped);
            }

            labelCantidad.Text = oOrdenProduccion.cap_utilizada.ToString();
            btnCalcTotal.Enabled = false;
            cmbProductos.Enabled = false;
        }

        private void calculaTotol(Entidades.Sistema.Pedido ped)
        {
            oProducto = (Entidades.Sistema.Producto)cmbProductos.SelectedItem;

            var query = (from det in ped.DetallePedidos
                         where det.producto.cod_producto == oProducto.cod_producto
                         select det).First();

            oOrdenProduccion.cap_utilizada = oOrdenProduccion.cap_utilizada + query.cantidad;
        }

        #endregion

        
    }
}
